package com.xinke.module.system.convert.menu;

import com.xinke.module.system.model.vo.user.MenuTreeVO;
import com.xinke.module.system.model.entity.user.MenuDO;

import java.util.function.Consumer;

public class MenuConvert {
    public static MenuDO convertVoToDo(MenuTreeVO vo) {
        if (vo == null) {
            return null;
        }
        MenuDO menuDO = new MenuDO();
        // 基础字段映射
        menuDO.setMenuId(vo.getId());
        menuDO.setMenuParentId(vo.getPid() != null ? vo.getPid() : MenuDO.ID_ROOT);
        menuDO.setMenuAuthCode(vo.getAuthCode());
        menuDO.setMenuComponent(vo.getComponent());
        menuDO.setMenuName(vo.getName());
        menuDO.setMenuPath(vo.getPath());
        menuDO.setMenuRedirect(vo.getRedirect());
        menuDO.setMenuType(vo.getType());
        menuDO.setMenuStatus(vo.getStatus());

        // 处理Meta字段映射
        MenuTreeVO.MenuMetaVO meta = vo.getMeta();
        if (meta != null) {
            // 逐一映射Meta字段，仅当源字段非空时赋值
            setIfNotNull(meta.getActiveIcon(), menuDO::setMetaActiveIcon);
            setIfNotNull(meta.getActivePath(), menuDO::setMetaActivePath);
            setIfNotNull(meta.getAffixTab(), menuDO::setMetaAffixTab);
            setIfNotNull(meta.getAffixTabOrder(), menuDO::setMetaAffixTabOrder);
            setIfNotNull(meta.getBadge(), menuDO::setMetaBadge);
            setIfNotNull(meta.getBadgeType(), menuDO::setMetaBadgeType);
            setIfNotNull(meta.getBadgeVariants(), menuDO::setMetaBadgeVariants);
            setIfNotNull(meta.getHideChildrenInMenu(), menuDO::setMetaHideChildrenInMenu);
            setIfNotNull(meta.getHideInBreadcrumb(), menuDO::setMetaHideInBreadcrumb);
            setIfNotNull(meta.getHideInMenu(), menuDO::setMetaHideInMenu);
            setIfNotNull(meta.getHideInTab(), menuDO::setMetaHideInTab);
            setIfNotNull(meta.getIcon(), menuDO::setMetaIcon);
            setIfNotNull(meta.getIframeSrc(), menuDO::setMetaIframeSrc);
            setIfNotNull(meta.getKeepAlive(), menuDO::setMetaKeepAlive);
            setIfNotNull(meta.getLink(), menuDO::setMetaLink);
            setIfNotNull(meta.getMaxNumOfOpenTab(), menuDO::setMetaMaxNumOfOpenTab);
            setIfNotNull(meta.getNoBasicLayout(), menuDO::setMetaNoBasicLayout);
            setIfNotNull(meta.getOpenInNewWindow(), menuDO::setMetaOpenInNewWindow);
            setIfNotNull(meta.getOrder(), menuDO::setMetaMenuOrder);
            setIfNotNull(meta.getQuery(), menuDO::setMetaQuery);
            setIfNotNull(meta.getTitle(), menuDO::setMetaTitle);
        }
        return menuDO;
    }

    // 辅助方法：仅当值不为空时调用setter
    private static  <T> void setIfNotNull(T value, Consumer<T> setter) {
        if (value != null) {
            setter.accept(value);
        }
    }
}